_pppp_hhhh_yyyy_ssss_iiii_oooo_cccc_kkkk performs the following functions:
verifies the requested transfer is valid by checking if the offset
is at or past the end of the device (this check is bypassed if the
size parameter argument _nnnn_bbbb_llll_oooo_cccc_kkkk_ssss is zero) and that the offset is a
multiple of NBPSCTR
sets up a buffer header describing the transfer
faults pages in and locks the pages impacted by the I/O transfer so
they can't be swapped out
calls the driver _ssss_tttt_rrrr_aaaa_tttt_eeee_gggg_yyyy routine passed to it (_s_t_r_a_t)
sleeps until the transfer is complete and is awakened by a call to
_bbbb_iiii_oooo_dddd_oooo_nnnn_eeee(D3) from the driver's I/O completion handler
performs the necessary cleanup and updates, then returns to the
driver routine
A transfer using _pppp_hhhh_yyyy_ssss_iiii_oooo_cccc_kkkk is considered valid if the specified data
location exists on the device, and the user has specified a storage area
large enough that exists in user memory space.
If _b_p is set to _NNNN_UUUU_LLLL_LLLL, a buffer is allocated temporarily and freed after
the transfer completes.
If _r_w_f_l_a_g is set to _BBBB______RRRR_EEEE_AAAA_DDDD, the direction of the data transfer will be
from the kernel to the user's buffer. If _r_w_f_l_a_g is set to _BBBB______WWWW_RRRR_IIII_TTTT_EEEE, the
direction of the data transfer will be from the user's buffer to the
kernel.
One block is equal to _NNNN_BBBB_PPPP_SSSS_CCCC_TTTT_RRRR bytes. _NNNN_BBBB_PPPP_SSSS_CCCC_TTTT_RRRR is defined in _ssss_yyyy_ssss_////_pppp_aaaa_rrrr_aaaa_mmmm_...._hhhh.